redux 基础模式
基础 redux 的完整模式为:
dispatch action -> redux middlewares -> reducers -> global state -> components
该模式存在如下问题:
多文件:一个
dispatch动作从发起到被reducer接收,期间通过某个具体的action type进行指令的传递。在传统的redux架构中,action type、action creator和reducer可能会散落在多个文件中,对于大型项目,这种 redux 架构会给开发者带来额外的开发和维护成本;在 Ducks 架构中,action type、action creator和reducer虽然被分配在同一个文件中,但是三者仍然是割裂的,需要通过开发者定义的action type来串联,这些action type对于react来说又是无感知的,建议移除action type的概念,同时将action creator和reducer结合起来使用。dispatch绑定:在使用connect的过程中,往往需要开发者通过mapDispatchToProps手动绑定dispatch函数和从别处引入的action creator,这种操作十分繁琐,更好地方式是在mapDispatchToProps中允许开发者按需加载已经绑定dispatch函数的action creator。
|
|
reducer描述形式:redux官方规定reducer必须是一个纯函数,reducer可根据接收到的不同action type来计算新的state。比起在纯函数中使用复杂的switch-case和if-else语句, 用对象的形式描述reducer,从代码层面看显然更加语义化,编写也更加简单。
|
|
payload字段规范:reducer接收的action参数中包含有开发者期望传入的参数,redux官方建议遵守FSA规范,但在实际使用时,redux并未强制使用该规范,但对一个项目而言,统一字段有利于项目的维护,而action type比较鸡肋,可以不予考虑,error和meta字段可以统一称为payload,因此上述例子中reducer接收的参数最好强制为是payload。
|
|
- 异步处理:
dispatch action可以划分为两类,同步action和异步action,异步action本质也是在不同时机发出同步action
|
|
- 领域建模:
redux本身是一套状态管理机制,并不支持与后端进行交互,因此需要用户自己去定义请求方式将请求与redux结合起来使用。由于前端缺少类似后端的service层和领域层,对于某个请求,常规的做法是定义一个请求函数,然后在redux或者react中去引用并调用该函数,这么做很多情况下比较繁琐,语义化差且不利于对后端的业务逻辑进行建模,这里提供一种redux结合领域的方式:通过一份配置meta文件去描述后端的领域模型DM,然后将DM注入到effects。
|
|
- immutable侵入:前端项目普遍使用了
immutable库,immutable对项目侵入程度比较大,使用方式又与原生的 js 类型操作有很大异同,加上繁琐的 fromJS 和 toJS 操作,会在一定程度上提升开发成本,可以考虑用immer替换并集成到redux的底层使用。